package com.linghang.association.utils;
/**
 * @author LinyaT052
 * @date 2022年07月18日 9:55
 * JWT生成工具类
 */
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.*;
/**
 * JWT由三部分组成：header,payload,signature
 * header储存令牌的类型和所使用的签名算法
 * payload为有效负载，包含声明，声明是有关实体（通常为用户实体）的基本信息，但不应包含敏感信息
 * 前面两部分都使用Base64进行编码，前端可以解开知道里面的信息。Signature需要使用编码后的header和payload
 * 加上我们提供的一个密钥，使用header中指定的签名算法(HS256)进行签名。签名的作用是保证JWT没有被篡改过
 */
public class JwtUtil {
    private static String SIGNATURE = "token!@#$%^7890";//签名
    /**
     * 生成token
     */
    public static String getToken(Map<String,String> map){
        JWTCreator.Builder builder = JWT.create();
        //将map中的键值对生成token
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });
        //生成日历对象
        Calendar instance = Calendar.getInstance();
        //token过期时间,72小时
        instance.add(Calendar.HOUR,72);
        //72小时重新登录一次
        builder.withExpiresAt(instance.getTime());
        //返回生成好的token值
        return builder.sign(Algorithm.HMAC256(SIGNATURE));
    }
    /**
     * 验证token
     * @param token
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }
    /**
     * 获取token中的payload
     * @param token
     * @return
     */
    public static DecodedJWT getPayload(String token){
        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }


}
